package com.xls.commonlibrary.ad.adn.baidu;

import android.app.Activity;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.ValueCallback;

import com.baidu.mobads.sdk.api.ArticleInfo;
import com.baidu.mobads.sdk.api.RequestParameters;
import com.baidu.mobads.sdk.api.RewardVideoAd;
import com.xls.commonlibrary.ad.adn.reward.bean.AdBean;
import com.xls.commonlibrary.constant.Const;
import com.xls.commonlibrary.util.ICallback;
import com.xls.commonlibrary.util.MMKVUtil;

public class BdAdUtil {

    private String TAG = "BdAdUtil";
    private Activity activity;
    private static volatile BdAdUtil singleton = null;

    private BdAdUtil(Activity activity) {
        this.activity = activity;
    }

    public static BdAdUtil getInstance(Activity activity) {
        if (singleton == null) {
            synchronized (BdAdUtil.class) {
                if (singleton == null) {
                    singleton = new BdAdUtil(activity);
                }
            }
        }
        return singleton;
    }

    // BD ad 相关============================================
    private RewardVideoAd mRewardVideoAd;
    private boolean needReload = true;

    ICallback mCallback;// todo 把ecpm回调到Observable，四个广告ecpm比较取最高，返给服务器，下次调这家广告

    /**
     * 激励视频加载监听
     */
    class CustomRewardListener implements RewardVideoAd.RewardVideoAdListener {

        @Override
        public void onVideoDownloadSuccess() {
            // 视频缓存成功
            // 建议：可以在收到该回调后，再调用show展示激励视频
            Log.i(TAG, "onVideoDownloadSuccess,isReady=" + mRewardVideoAd.isReady());
            toastText("视频缓存成功，可以进行展示");

            showLoadedVideo();
        }

        @Override
        public void onVideoDownloadFailed() {
            // 视频缓存失败，可以在这儿重新load下一条广告，最好限制load次数（4-5次即可）。
            Log.i(TAG, "onVideoDownloadFailed");
            toastText("视频缓存失败，请重新加载");

            callbackFail();
        }

        @Override
        public void playCompletion() {
            Log.i(TAG, "playCompletion");
        }

        @Override
        public void onRewardVerify(boolean rewardVerify) {
            // 激励视频奖励回调
            Log.i(TAG, "onRewardVerify: " + rewardVerify);
        }

        @Override
        public void onAdSkip(float playScale) {
            // 用户点击跳过, 展示尾帧
            Log.i(TAG, "onSkip: " + playScale);

            callbackShowSuccess();
        }

        @Override
        public void onAdLoaded() {

            // 请求成功回调
            Log.i(TAG, "onAdLoaded");
            toastText("广告请求成功，等待物料缓存");
//            if (mBtnShow != null) {
//                mBtnShow.setEnabled(true);
//            }
        }

        @Override
        public void onAdShow() {
            // 视频开始播放时候的回调
            Log.i(TAG, "onAdShow");
        }

        @Override
        public void onAdClick() {
            // 广告被点击的回调
            Log.i(TAG, "onAdClick");
        }

        @Override
        public void onAdClose(float playScale) {
            // 用户关闭了广告，直到开始下一次load前，将不会再收到任何回调
            // 说明：关闭按钮在mssp上可以动态配置，媒体通过mssp配置，可以选择广告一开始就展示关闭按钮，还是播放结束展示关闭按钮
            // 建议：收到该回调之后，可以重新load下一条广告,最好限制load次数（4-5次即可）
            // playScale[0.0-1.0],1.0表示播放完成，媒体可以按照自己的设计给予奖励
            Log.i(TAG, "onAdClose" + playScale);
            toastText("用户已关闭广告，请重新加载");
            needReload = true;

            if (mCallback != null) {
                mCallback.callback();
            }

            callbackShowSuccess();

//            if (mBtnShow != null) {
//                mBtnShow.setEnabled(false);
//            }
        }

        @Override
        public void onAdFailed(String arg0) {
            // 广告失败回调，直到开始下一次load前，将不会再收到任何回调
            // 失败可能原因：广告内容填充为空；网络原因请求广告超时等
            // 建议：收到该回调之后，可以重新load下一条广告，最好限制load次数（4-5次即可）
            Log.i(TAG, "onAdFailed" + arg0);
            toastText("广告失败：" + arg0 + "，请重新加载");
            needReload = true;

            callbackFail();

            callbackShowFail();



//            if (mBtnShow != null) {
//                mBtnShow.setEnabled(false);
//            }
        }
    }

    /**
     * 请求加载下一条激励视频广告
     */
    private void loadNextVideo(String adId) {
        toastText("正在请求百度广告...adId=" + adId);
        if (TextUtils.isEmpty(adId)) {
            toastText("adId为空,请设置");

            callbackFail();

            return;
        }
        // 激励视屏产品可以选择是否使用SurfaceView进行渲染视频
        mRewardVideoAd = new RewardVideoAd(activity,
                adId, new CustomRewardListener());
        int mDownloadConfirmPolicy = AdSettingHelper.getInstance()
                .getIntFromSetting(AdSettingProperties.REWARD_VIDEO_DOWNLOAD_CONFIRM_POLICY
                        , RewardVideoAd.DOWNLOAD_APP_CONFIRM_NEVER);
        mRewardVideoAd.setDownloadAppConfirmPolicy(mDownloadConfirmPolicy);
        mRewardVideoAd.setUserId("user123456");
        mRewardVideoAd.setExtraInfo("aa?=bb&cc?=dd");
        // 【可选】【Bidding】设置广告的底价，单位：分
        mRewardVideoAd.setBidFloor(100);
        // 自定义传参
        final RequestParameters requestParameters = new RequestParameters.Builder()
                /**
                 * 【激励视频传参】传参功能支持的参数见ArticleInfo类，各个参数字段的描述和取值可以参考如下注释
                 * 注意：所有参数的总长度(不包含key值)建议控制在150字符内，避免因超长发生截断，影响信息的上报
                 */
                // 通用信息：用户性别，取值：0-unknown，1-male，2-female
                .addCustExt(ArticleInfo.USER_SEX, "1")
                // 最近阅读：小说、文章的名称
                .addCustExt(ArticleInfo.PAGE_TITLE, "测试书名")
                // 自定义传参，参考如下接入
                .addCustExt("cust_这是Key", "cust_这是Value" + System.currentTimeMillis())
                .addCustExt("Key2", "Value2")
                .build();
        // 若传参，如下设置
        mRewardVideoAd.setRequestParameters(requestParameters);
        // 请求广告，展示前必须调用
        mRewardVideoAd.load();
        needReload = false;
    }

    /**
     * 展示已加载的激励视频广告，需要提前进行load
     */
    private void showLoadedVideo() {
        if (mRewardVideoAd == null || needReload) {
            toastText("请在加载成功后进行广告展示！");

            callbackFail();

            return;
        }
        // 1. 强烈建议在收到onVideoDownloadSuccess回调、视频物料缓存完成后再展示广告，
        //    提升激励视频的播放体验，否则有播放卡顿的风险。
        // 2. 在展示前可以调用isReady接口判断广告是否就绪：
        //    此接口会判断本地是否存在【未展示 & 未过期 & 已缓存】的广告
        if (!mRewardVideoAd.isReady()) {
            toastText("视频广告未缓存/已展示/已过期");

            callbackFail();

            return;
        }
        toastText("视频广告展示");

        // by lk 获取 广告的ecpm等数据
//        获取价格或价格标签，若广告位未配置则返回空（如有需要，请联系百青藤商务对接人申请相关权限）
//        toastText(mRewardVideoAd.getECPMLevel());
//        toastText(mRewardVideoAd.getBiddingToken());
        toastText("ecpm=" + mRewardVideoAd.getECPMLevel());

        // todo save to db
        //BDDBUtil.putReward(mRewardVideoAd);

        callback(mRewardVideoAd.getECPMLevel());

        // 是否在跳过按钮后展示弹框 (默认点击跳过不展示弹框) , 可在广告配置页面配置
        boolean isShowDialog = AdSettingHelper.getInstance()
                .getBooleanFromSetting(AdSettingProperties.REWARD_VIDEO_SHOW_DIALOG, false);
        mRewardVideoAd.setShowDialogOnSkip(isShowDialog);
        // 是否展示奖励领取倒计时提示 (默认不显示) , 可在广告配置页面配置
        boolean useRewardCountdown = AdSettingHelper.getInstance()
                .getBooleanFromSetting(AdSettingProperties.REWARD_VIDEO_SHOW_COUNTDOWN, false);
//        mRewardVideoAd.setUseRewardCountdown(useRewardCountdown);
        // show之前必须调用load请求广告，否则无效

        if (isShow) {
            mRewardVideoAd.show();
        }
    }

//    private void initView() {
//        mStateTextView = this.findViewById(R.id.rv_state_view);
//        Button btn1 = this.findViewById(R.id.btn_change_orientation);
//        btn1.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                int currentOrientation = getResources().getConfiguration().orientation;
//                if (currentOrientation == ORIENTATION_PORTRAIT) {
//                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//                } else if (currentOrientation == ORIENTATION_LANDSCAPE) {
//                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//                }
//            }
//        });
//
//        Button btn2 = this.findViewById(R.id.btn_load);
//        btn2.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                // 加载下一条激励视频广告
//                loadNextVideo();
//            }
//        });
//
//        mBtnShow = this.findViewById(R.id.btn_show);
//        mBtnShow.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                // 播放已加载的激励视频广告
//                showLoadedVideo();
//            }
//        });
//
//        mAdPlaceIdView = findViewById(R.id.edit_apid);
//        mAdPlaceIdView.setText(AD_PLACE_ID);
//        mAdPlaceIdView.clearFocus();
//    }

    private void toastText(String text) {
        // 不toast了，改log即可
         // Toaster.show(text);
    }

    // 加载下一条激励视频广告
//    loadNextVideo();
    // 播放已加载的激励视频广告
//    showLoadedVideo();
    private ValueCallback<String> callback;
    private ValueCallback<AdBean> callbackShow;// 播放 专用回调   将AdBean回调到UI层




    private boolean isShow = true; // 默认show广告，单纯取ecpm的时候，不show

    private void callbackFail() {
        callback("-1");
    }

    private void callback(String ecpm) {
        if (callback != null) {
            callback.onReceiveValue(ecpm);
        }
    }

    public void showBdAd(boolean isShow, ValueCallback<String> callback) {
        this.callback = callback;
        this.isShow = isShow;

        showBdAd();
    }
    public void showAd( ValueCallback<AdBean> callback) {
        this.callbackShow = callback;
        this.isShow = true;

        showBdAd();
    }

    public void callbackShowSuccess() {// 播放成功回调
        if (callbackShow == null) return;
        // build AdBean for callback
        AdBean bean = new AdBean();
        bean.setShowSuccess(true);
        bean.setEcpm(mRewardVideoAd.getECPMLevel());
        bean.setAdn(Const.TYPE_BD);
        bean.setAdType("激励视频");
        callbackShow.onReceiveValue(bean);
    }

    public void callbackShowFail() {// 播放失败回调
        if (callbackShow == null) return;
        // build AdBean for callback
        AdBean bean = new AdBean();
        bean.setShowSuccess(false);
        callbackShow.onReceiveValue(bean);
    }



    public void showBdAd() {

        String adId = MMKVUtil.getInstance().getKV().decodeString(Const.KEY_AD_ID_BD);
        if (TextUtils.isEmpty(adId)) {
//                 默认demo的appId
            // 测试数据
            // adId = "5989414";


            adId = "12182657";
        }
        loadNextVideo(adId);
    }

    // BD ad 相关============================================


}
